今天要介紹的方法都是我最喜歡的!
這個方法可以讓你從陣列中隨機挑一個值!
但要注意的是,它回傳的是那個值的 key!
所以如果你要取得它挑出的值,你需要回頭再把 key 塞進陣列才行~
<?php
$types = [
'紅豆',
'奶油',
'羅蔔',
'地瓜',
'芋頭',
];
$index = array_rand($types);
echo $types[$index];
上面的範例是在不給定第二個變數時,array_rand
只會隨機挑出一個,並直接以 int
回傳。
但如果你在第二個變數給定一個大於 1 的數字,array_rand
就會回傳一個 array
,裡面都是它挑出來的值的 index。
<?php
$types = [
'紅豆',
'奶油',
'羅蔔',
'地瓜',
'芋頭',
];
$indexes = array_rand($types, 2);
foreach ($indexes as $index) {
echo $types[$index] . PHP_EOL;
}
array_column 可以幫你從一個二維陣列中,僅取出每個第二層陣列中的指定欄位。
PHP7 之後這個方法也接受傳入一個裡面都是 Object 的陣列!
具體的效果你可以把WheelPieFactory::get(5, FALSE);
中的 FALSE 改成 TRUE,
再把程式碼丟進 PHP7 的環境測試~但只能取出 Object 中是
public
的資料。
如果你需要取出private
的資料,
你需要實作他們的__get()
及__isset
兩個方法!
例子時間~
某個你還是國小生時的禮拜三下午,成長中的你精力無限、餓的也特別快。
來的好不如來的巧,此時此刻你的媽媽也帶著五個車輪餅回家了!
但,可惜的是媽媽請老闆隨便夾了五個紅豆餅。
只喜歡其中幾種的你,要如何分辨每一個都長的一模一樣的車輪餅的口味呢?
還好 PHP 沒有辦不到的事情!
試著用 array_column
把五個紅豆餅的口味資訊抓出來吧!
<?php
class WheelPie
{
public $type;
public $price;
public function __construct($type, $price)
{
$this->type = $type;
$this->price = $price;
}
}
class WheelPieFactory
{
public static $types = [
'紅豆',
'奶油',
'羅蔔',
'地瓜',
'芋頭',
];
public static function get($counts, $returnObject = FALSE)
{
return array_map(
function () use ($returnObject) {
/**
* Static Property
* @see http://php.net/manual/en/language.oop5.static.php#language.oop5.static.properties
*/
$type = static::$types[array_rand(static::$types)];
$price = rand(10, 20);
/**
* 可以用 compact 簡化 ==> compact('type', 'price')
*
* @see http://php.net/manual/en/function.compact.php
*/
$arrayResult = [
'type' => $type,
'price' => $price
];
return $returnObject
? new WheelPie($type, $price)
: $arrayResult;
},
range(1, $counts)
);
}
}
$mother = WheelPieFactory::get(5, FALSE);
// print_r($mother);
print_r(array_column($mother, 'type'));
顧名思義,array_keys
可以把陣列的 keys 單獨抽出來(並以陣列的方式回傳);array_values
可以把陣列的 values 單獨抽出來(而且不保留原本的 key)
注意!
它們兩個都不會對傳入的陣列本身操作,而是直接把結果傳回來。
比如說,你現在站在一個水果攤前面,
價目表上羅列著各種水果的單價...
<?php
$kanban = [
'橘子' => 15,
'桃子' => 30,
'水梨' => 50,
'芭樂' => 25,
'香蕉' => 10,
];
但如果你也是在開水果行的,而你只想要知道這間店有賣哪些水果,
你就可以使用 array_keys 把它們列出來:
print_r(array_keys($kanban));
但如果你是一個記者,你只想要知道每種水果的售價,並用它們作為報導的材料:
print_r(array_values($kanban));
顧名思義!這個方法可以幫你把陣列裡面重複的值去掉,並把處理乾淨的陣列回傳給你~
那它是如何比較各個元素是否一樣呢?
其實,它會把兩個需要被比較的值當成 String
,並用全等運算符(===
)比較它們。
注意!這個方法只會回傳每個重複值的第一個!
另外,array_unique 的第二個可選參數可以告訴它:
應該把陣列中的值視為怎樣的資料型態(預設是 String),並比較它們。
我就不寫僅包含基本資料型態的陣列被執行 array_unique
之後的效果了。
底下我展示的是,當一個陣列裡都是物件的狀況。
先講結論,
裡面這些物件都必須實作 __toString
方法才能被比較哦~
<?php
class WheelPie
{
public $type;
public $price;
public function __construct($type, $price)
{
$this->type = $type;
$this->price = $price;
}
public function __toString()
{
return $this->type;
}
}
class WheelPieFactory
{
public static $types = [
'紅豆',
'奶油',
'羅蔔',
'地瓜',
'芋頭',
];
public static function get($counts, $returnObject = FALSE)
{
return array_map(
function () use ($returnObject) {
$type = static::$types[array_rand(static::$types)];
$price = rand(10, 20);
$arrayResult = [
'type' => $type,
'price' => $price
];
return $returnObject
? new WheelPie($type, $price)
: $arrayResult;
},
range(1, $counts)
);
}
}
$pies = WheelPieFactory::get(10, TRUE);
print_r(array_unique($pies));